package com.reactor.part01;

/**
 * @author reactor
 * @date 2021/10/25 下午9:49
 * @description：编译优化后的有序性问题,new操作有问题
 * 正常理解步骤：1、分配一块内存 M；2、在内存 M 上初始化 Singleton 对象；3、然后 M 的地址赋值给 instance 变量。
 * 编译优化后步骤：1、分配一块内存 M；2、然后 M 的地址赋值给 instance 变量；3、在内存 M 上初始化 Singleton 对象。
 **/
public class Singleton {
    private int x = 1;
    static Singleton instance;
    static Singleton getInstance(){
        if (instance == null){
            synchronized (Singleton.class){
                if (instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    public static void main(String[] args) {
        Thread th1 = new Thread(()->{
            Singleton instance = getInstance();
            System.out.println(instance.x);
        });
        Thread th2 = new Thread(()->{
            Singleton instance = getInstance();
            System.out.println(instance.x);
        });

        th1.start();
        th2.start();
    }
}
